package com.systemic.controller;

import com.systemic.core.ResponseResult;
import com.systemic.pojo.User;
import com.systemic.service.UserService;
import com.systemic.vo.LoginSucceeded;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * @ClassName: LoginController
 * @Description:
 * @Author:
 * @CreateTime: 2023-12-28 09:49
 * @Version:
 **/

@RestController
@RequestMapping("/login")
public class LoginController {

    /**
     * <h4>登录处理逻辑（分为两个接口实现）</h4>
     * <br>1.第一次请求处理：校验账号是否存在</br>
     * <br>2.第二次请求处理：校验与账号对应的密码，如果正确，进一步判断用户状态是否已经登陆，若两个条件都满足，服务端将会返回该用户的token，否则返回错误信息</br>
     */

    private final UserService userService;

    public LoginController(UserService userService) {
        this.userService = userService;
    }

    /**
     * 第一次请求处理：校验账号
     * @param user
     * @return
     */
//    @PostMapping("/account")
//    public ResponseResult<String> findByAccount(@RequestBody User user, HttpServletRequest request) {
//        System.out.println("开始校验账号...");
//        User userEntity = userService.findByAccount(user.getAccount());
//        if (userEntity != null) {
//            System.out.println("账号校验成功");
//            String userId = String.valueOf(userEntity.getUid()); // 类型转换
//            HttpSession session = request.getSession(false); // 尝试获取session，如果当前没有session则返回null
//            if (session.getAttribute(userId) == null) {
//                // 用户未登录，进行登录操作
//                return ResponseResult.success("校验成功，请输入密码"); // 或者返回其他的登录成功信息
//            } else {
//                // 用户已登录，返回提示信息
//                return ResponseResult.failed("用户已经登录"); // 或者返回其他的提示信息
//            }
//        }
//        System.out.println("账号不存在！");
//        return ResponseResult.failed("账号错误");
//    }
    @PostMapping("/account")
    public ResponseResult<String> findByAccount(@RequestBody User user, HttpServletRequest request) {
        System.out.println("开始校验账号...");
        User userEntity = userService.findByAccount(user.getAccount());
        if (userEntity != null) {
            System.out.println("账号校验成功");
            String userId = String.valueOf(userEntity.getUid()); // 类型转换
            HttpSession session = request.getSession(false); // 此处可能产生null
            if (session == null) {
                return ResponseResult.success("校验成功，请输入密码");
            }
            if (session.getAttribute(userId) == null) {
                // 用户未登录，进行登录操作
                return ResponseResult.success("校验成功，请输入密码"); // 或者返回其他的登录成功信息
            } else {
                // 用户已登录，返回提示信息
                return ResponseResult.failed("用户已经登录"); // 或者返回其他的提示信息
            }
        }
        System.out.println("账号不存在！");
        return ResponseResult.failed("账号错误");
    }

    /**
     * 第二次请求处理：完成登录
     * @param userEntity
     * @return
     */
    @PostMapping("/account&password")
    public ResponseResult<LoginSucceeded> findByAccountAndPassword(@RequestBody User userEntity, HttpServletRequest request) {
        System.out.println("进入登录接口...");
        User user = userService.findByAccountAndPassword(userEntity.getAccount(), userEntity.getPassword());
        String userId = String.valueOf(user.getUid()); // 类型转换
        if (user != null) {
            // TODO: 实现登录成功的逻辑
//            String token = JwtTokenUtils.sign(user);
//            user.setToken(token);
            System.out.println("登录成功");
            HttpSession session = request.getSession(); // 获取当前HTTP请求的session对象
            session.setAttribute(userId, user);
            // 将用户ID用作session属性的键
            LoginSucceeded res = new LoginSucceeded();
            res.setUid(user.getUid());
            res.setAccount(user.getAccount());
//            res.setToken(user.getToken());
            return ResponseResult.success(res);
        }
        return ResponseResult.failed("密码错误");
    }


    /**
     * 退出登录逻辑
     * @param uid
     * @param request
     * @return
     */
    @GetMapping("/logout/{uid}")
    public ResponseResult<String> logOut(@PathVariable("uid") Integer uid, HttpServletRequest request){
        if (uid!=0){
            HttpSession session = request.getSession(false); // 尝试获取session，如果当前没有session则返回null
            String userId = String.valueOf(uid); // 类型转换
            if (session == null || session.getAttribute(userId) == null) {
                return ResponseResult.failed("用户离线，无需退出");
            } else {
                // 清除用户缓存
                session.removeAttribute(userId);
                System.out.println("用户"+ userId + "已成功退出");
            }
        }
        return ResponseResult.success("已成功退出");
    }


}
